rrdtool

流程

  • 建立rrd file rrdtool create x.rrd
  • 更新rrd data rrdtool update x.rrd
  • 繪圖 rrdtool graph x.gif

縮寫 / 術語

縮寫 全名 備註
DS Data Source
DST Data Source Type COUNTER/DERIVE/ABSOLUTE/GAUGE
RRA Round Robin Archives
PDP Primary Data Point update 的資料
CF Consolidation Function MIN/MAX/AVERAGE/LAST
CDP Consolidation Data Point RRA 中合併數筆的 PDP 資料
Resolution Resolution 一個粒度的時間範圍
DEF data definiton
VDEF variable definition
CDEF data calculation blank

資料格式

資料格式 說明 自我理解
COUNTER 累計值
最後以秒計算
數值為正數
數值為正數
跟上一筆資料取差值
再除以step秒數
DERIVE 同 COUNTER
可處理負數
數值可為負數
跟上一筆資料取差值
再除以step秒數
ABSOLUTE 數值為相對比值
第一筆資料為對比
數值是相對值
相對第一筆資料的比值
100:300 -> 1:3
GAUGE 直接數值 , 非以秒計 填寫多少,就是多少
Values       =  300, 600, 900, 1200
Step         =  300 seconds
COUNTER DS   =    1,   1,   1,    1  # (300 - 0) / Step, (600 - 300) / Step
DERIVE DS    =    1,   1,   1,    1  # (300 - 0) / Step, (600 - 300) / Step
ABSOLUTE DS  =    1,   2,   3,    4  # 第一個數字為300, 所以 300 / 300, 600 / 300
GAUGE DS     =  300, 600, 900, 1200  # 300, 600, 900, 1200

Create

rrdtool create filename
    [--start|-b start time]
    [--step|-s step]
    [--no-overwrite|-O]
    [DS:ds-name:DST:dst arguments]
    [RRA:CF:cf arguments]
名稱 指令 備註
start --start 978300900
-b 978300900
資料開始時間
預設現在(建議此值可為 step 除盡)
step --step 300
-s 300
資料的更新頻率
預設為 300秒
DS [DS:ds-name:DST:Heartbeat:Min:Max]
DS:ds0:GAUGE:1200:-10000:10000
DS:ds1:COUNTER:1200:0:U
heartbeat 通常為 step 之倍數
資料格式為GAUGE的變數ds0,有效範圍1200秒,值介於-10000~10000
資料格式為COUNTER的變數ds1,有效範圍1200秒,值介於0~ 無限制 (U)
RRA [RRA:AVERAGE|MIN|MAX|LAST:xff:steps:rows] 合併特性 (CF)
連續性 (xff)
時間特性 (steps)
筆數 (rows)
start 978300000
heartbeat 900
update 978300300 1
update 978301200 2
update 978302100 3

978300300: 1.0000000000e+00
978300600: 2.0000000000e+00
978300900: 2.0000000000e+00
978301200: 2.0000000000e+00
978301500: 3.0000000000e+00
978301800: 3.0000000000e+00
978302100: 3.0000000000e+00

# step 預設 300s
RRA:AVERAGE:0.5:1:288      # 300 * 1 * 288 = 86400 = 1day
RRA:AVERAGE:0.5:4:504      # 300 * 4 * 504 = 604800 = 7day
RRA:AVERAGE:0.5:12:720     # 300 * 12 * 720 = 30day

http://www.generationip.com/documentation/Howto/46-rrdtool-round-robin-database-howto-version-1

Update

rrdtool update filename
    --template|-t ds-name:ds-name:...
    time|N:value[:value...]
    at-time@value[:value...]
    [ time:value[:value...] ..]

# ex :
rrdtool update test.rrd 920808300:12420:U     # U UNKNOWN
rrdtool update test.rrd N:12420               # N 為現在的時間
rrdtool update demo3.rrd -- -5:21             # 五秒前
# update 要比RRA最後一筆資料還要新
# DS 有多少,update資料數也要相同

Graph

Time Range

# 開始時間 預設一天前
# 結束時間 預設現在
[-s|--start time] [-e|--end time] [-S|--step seconds]

# ex:
--start 978300000 --end 979078500

# start end step 以DEF定義的為主
DEF:value1=eth0.rrd:eth0_in:AVERAGE:start=x:end=y:step=z

DEF:value1=eth0.rrd:eth0_in:AVERAGE:end=now:start=end-1h \        # 当前1小时内
DEF:value2=eth0.rrd:eth0_in:AVERAGE:end=now-1h:start=now-2h \        # 2小时前
DEF:value3=eth0.rrd:eth0_in:AVERAGE:end=now-2h:start=now-3h \        # 3小时前
LINE1:value1#00ff00:"1 hours ago" \
LINE2:value2#ff0000:"2 hours ago" \
LINE3:value3#000000:"3 hours ago"

圖表大小 Size

[-w|--width pixels] [-h|--height pixels]

Y 軸上下限(Limits)

# -–rigid ,则严格按照 –-upper-limit 和 –-lower-limit 绘制
[-u|--upper-limit value] [-l|--lower-limit value] [-r|--rigid]

X/Y 軸刻度(Grid)

# 去掉 X/Y 轴的刻度
[-x|--x-grid none]
[-y|--y-grid none]

# GTM:GST :控制次要格网线的位置
# MTM:MST :控制主要网格线的位置
# LPR:LFM :LTM:LST 只是决定了 label 的显示位置了
# GTM/MTM 是一个时间单位,可以是 SECOND、MINUTE、HOUR、DAY 、WEEK、MONTH、YEAR
# GST/MST 则是一个数字
# 每15分钟一根次要网格线,则格式为 MINUTE:15
# LPR 指的是如何放置 label 。如果LPR 为0,则数字对齐格线
# LFM date 命令的参数。%a(星期几)、%b(月份)、%d(天)、%H(小时)、%M(分)、%Y(年)
[-x|--x-grid GTM:GST:MTM:MST:LTM:LST:LPR:LFM]

# ex:
–-x-grid MINUTE:15:HOUR:1:HOUR:1:0:’%H:%M’

# grid step :用于控制Y轴每隔多少显示一根水平线
# label factor :默认为1,也就是在每根水平线的高度那里显示一个值。
[-y|--y-grid grid step:label factor]

# –Y ,它可以最大限度的优化 Y 轴的刻度
[-Y|--alt-y-grid]

# –X 设置 Y 轴刻度值的(范围是 -18、-15、-12、-9、-6 、-3、0、3、6、9、12、15、18),預設0
# -X 3 單位1000
# -X 6 單位1000000
[-X|--units-exponent value]

其他(Miscellaneous)

# FONTTAG 图表的某個部分 DEFAULT(全部),TITLE(标题)、AXIS(坐标轴字体)、UNIT(Y轴单位字体)、LEGEND(图例字体)
# size 字体大小
# font 字型擋位置
[-n|--font FONTTAG:size:[font]]

# ex:
# 修改标题的字体为黑体
-n TITLE:10:'/home/bob/Fonts/simhei.ttf'

# 取消图表下方的图例
[-g|--no-legend]

# 默认 1k=1000
[-b|--base value]

数字报表

DEF:value1=eth0.rrd:eth0_in:AVERAGE \
DEF:value2=eth0.rrd:eth0_out:AVERAGE \
COMMENT:" \n" \
COMMENT:"         当前值--------------平均值--------------最大值--------------最小值--------------\n"
COMMENT:" \n"
AREA:value1#00FF00:"流入" \
GPRINT:value1:LAST:'%13.2lf'  \
GPRINT:value1:AVERAGE:%13.2lf  \
GPRINT:value1:MAX:%13.2lf  \
GPRINT:value1:MIN:%13.2lf  \
COMMENT:" \n" \
LINE2:value2#ff0000:"流出":STACK \        # 注意这里是 STACK 方式
GPRINT:value2:LAST:%13.2lf  \
GPRINT:value2:AVERAGE:%13.2lf  \
GPRINT:value2:MAX:%13.2lf  \
GPRINT:value2:MIN:%13.2lf  \
COMMENT:" \n" \
COMMENT:" \n" \
COMMENT:"LAST UPDATED \:$(date '+%Y-%m-%d %H\:%M')\n" -Y

特殊功能

# VRULE/HRULE 可以用于在图表上面绘制垂直线/水平线
VRULE:time#color[:legend]
HRULE:value#color[:legend]

# ex:
# 在 100k 处画一根水平线,并指出这是最大值。
HRUE:100000#ff0000:"最大值"

SHIFT:vname:offset

# ex:
DEF:value1=eth0.rrd:eth0_in:AVERAGE:end=now:start=now-1d \                # 1天前
DEF:value2=eth0.rrd:eth0_in:AVERAGE:end=now-1d:start=now-2d \             # 2天前
DEF:value3=eth0.rrd:eth0_in:AVERAGE:end=now-2d:start=now-3d \             # 3天前
LINE1:value1#00ff00:"1 day ago"  \
SHIFT:value2:86400 LINE1:value2#ff0000:"2 days ago" \                     # 把曲线向右移动1天
SHIFT:value3:172800 LINE1:value3#000000:"3 days ago" \                    # 把曲线向右移动2天

RPN 後綴表示式

man rrdgraph_rpn

類型 指令 RPN 中綴
布尔操作符 GT、GE、LT、LE、EQ、NE 2,1,GE 2>=1
特殊值比较符 UN、ISINF mydata,UN mydata == UNKNOWN
条件操作符 IF mydata,UN,0,mydata,IF
if mydata == UNKNOWN:
return 0
else:
return mydata
比较操作符 MIN、MAX、LIMIT mydata,20,MAX
alpha,0,100,LIMIT
MAX(mydata,20)
LIMIT(alpha,0,100)
算术操作符 + 、-、*、/、%、SIN, COS,
LOG, EXP, SQRT、FLOOR, CEIL、
ATAN、ATAN2、DEG2RAD, RAD2DEG
1,2,- 1-2
数据集操作符 所谓数据集(sets),就是指多个数据。
SORT、REV、AVG、TREND
v1,v2,v3,v4,3,SORT v1,SORT(v2,v3,v4)
特殊值 UNKN、INF、NEINF、PREV、COUNT mydata,0,GT,UNKN,mydata,IF
if mydata > 0:
return UNKNOWN
else:
return mydata
时间操作符 NOW、TIME、LTIME TIME
NOW
目前這筆記錄的Timestamp
現在的Timestamp
堆栈操作符 POP、DUP、EXC EXC 最頂的第1,2元素交換
example.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
rrdtool create all2.rrd --start 978300000  \
--step 300 \
DS:a:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:12 \ # 1 hour - 05-minute resolution
RRA:AVERAGE:0.5:3:8 \ # 2 hour - 15-minute resolution
RRA:AVERAGE:0.5:6:6 \ # 3 hour - 30-minute resolution
RRA:MAX:0.5:1:12 \
RRA:MAX:0.5:3:8 \
RRA:MAX:0.5:6:6

numberOfTimes=$((48+1))
inputUpdateTime=978300300
value=1
while [[ "$value" != "$numberOfTimes" ]]; do
#statements
echo $value
rrdtool update all2.rrd $inputUpdateTime:$value
value=$(($value+1))
inputUpdateTime=$(($inputUpdateTime+300))
done

rrdtool graph all2.gif -s $(($inputUpdateTime-300-7200)) -e $inputUpdateTime -h 400 \
DEF:linea=all2.rrd:a:AVERAGE:start=$(($inputUpdateTime-300-03600)):end=$inputUpdateTime \
DEF:lineb=all2.rrd:a:AVERAGE:start=$(($inputUpdateTime-300-07200)):end=$inputUpdateTime \
DEF:linec=all2.rrd:a:AVERAGE:start=$(($inputUpdateTime-300-10800)):end=$inputUpdateTime \
LINE1:linea#FF0000:"Line A" \
LINE2:lineb#00ff00:"Line B" \
LINE3:linec#0000ff:"Line C"

Result

Source:

Timestamp:

date

rrdtool first eth0.rrd --rraindex 3
date -d '1970-01-01 1100822400 sec utc'